#pragma once

#define TASK_TI_KERNEL_SP(ti) 16(ti)
#define TASK_TI_USER_SP(ti) 24(ti)

#define TASK_THREAD_RA_RA(reg) 0(reg)
#define TASK_THREAD_SP_RA(reg) 8(reg)
#define TASK_THREAD_S0_RA(reg) 16(reg)
#define TASK_THREAD_S1_RA(reg) 24(reg)
#define TASK_THREAD_S2_RA(reg) 32(reg)
#define TASK_THREAD_S3_RA(reg) 40(reg)
#define TASK_THREAD_S4_RA(reg) 48(reg)
#define TASK_THREAD_S5_RA(reg) 56(reg)
#define TASK_THREAD_S6_RA(reg) 64(reg)
#define TASK_THREAD_S7_RA(reg) 72(reg)
#define TASK_THREAD_S8_RA(reg) 80(reg)
#define TASK_THREAD_S9_RA(reg) 88(reg)
#define TASK_THREAD_S10_RA(reg) 96(reg)
#define TASK_THREAD_S11_RA(reg) 104(reg)


#define PT_SIZE_ON_STACK (36*8)

#define PT_EPC(reg) (0)(reg)
#define PT_RA(reg) (8)(reg)
#define PT_SP(reg) (16)(reg)
#define PT_GP(reg) (24)(reg)
#define PT_TP(reg) (32)(reg)
#define PT_T0(reg) (40)(reg)
#define PT_T1(reg) (48)(reg)
#define PT_T2(reg) (56)(reg)
#define PT_S0(reg) (64)(reg)
#define PT_S1(reg ) (72)(reg)
#define PT_A0(reg) (80)(reg)
#define PT_A1(reg) (88)(reg)
#define PT_A2(reg) (96)(reg)
#define PT_A3(reg) (104)(reg)
#define PT_A4(reg) (112)(reg)
#define PT_A5(reg) (120)(reg)
#define PT_A6(reg) (128)(reg)
#define PT_A7(reg) (136)(reg)
#define PT_S2(reg) (144)(reg)
#define PT_S3(reg) (152)(reg)
#define PT_S4(reg) (160)(reg)
#define PT_S5(reg) (168)(reg)
#define PT_S6(reg) (176)(reg)
#define PT_S7(reg) (184)(reg)
#define PT_S8(reg) (192)(reg)
#define PT_S9(reg) (200)(reg)
#define PT_S10(reg) (208)(reg)
#define PT_S11(reg) (216)(reg)
#define PT_T3(reg) (224)(reg)
#define PT_T4(reg) (232)(reg)
#define PT_T5(reg) (240)(reg)
#define PT_T6(reg) (248)(reg)
#define PT_STATUS(reg) (256)(reg)
#define PT_BADADDR(reg) (264)(reg)
#define PT_CAUSE(reg) (272)(reg)

#define SBI_HART_BOOT_TASK_PTR_OFFSET 0 /* offsetof(struct sbi_hart_boot_data, task_ptr) */
#define SBI_HART_BOOT_STACK_PTR_OFFSET 8 /* offsetof(struct sbi_hart_boot_data, stack_ptr) */
